package saii.integracion.wrapper.fd2;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

import saii.business.modelo.Asignatura;
import saii.business.modelo.AsignaturaNota;
import saii.business.modelo.AsignaturaProfesor;
import saii.business.modelo.Profesor;
import saii.integracion.utilidades.Archivo_Propiedades;
import saii.integracion.wrapper.relacional.FuenteDatosRelacional;
import saii.integracion.wrapper.relacional.IFilaRelacional;
import saii.integracion.wrapper.relacional.IFuenteDatosRelacional;
import saii.integracion.wrapper.relacional.ITablaRelacional;

public class WrapperFD2 implements IWrapperFD2 {
	
	Properties propiedades = new Archivo_Propiedades().getProperties();
	
	private String HOST = "";
	private int PUERTO = Integer.parseInt(propiedades.getProperty("PUERTO_FD2"));
	private String USUARIO = propiedades.getProperty("USUARIO_FD2");
	private String PASSWORD = propiedades.getProperty("PASSWORD_FD2");
	private String SCHEMA = propiedades.getProperty("SCHEMA_FD2");
	
	private ConnectionPoolFD2 pool;
	
	public WrapperFD2() throws SQLException {
		
		//obtenemos una conexion.
		
		this.pool = ConnectionPoolFD2.getInstance();
	}

	@Override
	public String getHost() {
		return this.HOST;
	}

	@Override
	public int getPuertoConexion() {
	
		return this.PUERTO;
	}

	@Override
	public String getUser() {
		return this.USUARIO;
	}

	@Override
	public String getPassword() {
		return this.PASSWORD;
	}

	@Override
	public ITablaRelacional getTablaRelacional(String nombreTabla) {
		return null;
	}

	@Override
	public IFilaRelacional getFilaRelacional(int numeroFila, String nombreTabla) {
		return null;
	}

	@Override
	public ArrayList<IFilaRelacional> getConjuntoFilaRelacional(
			int limiteInferior, int limiteSuperior, String nombreTabla) {
		return null;
	}


	@Override
	public IFuenteDatosRelacional getFuenteDatos() throws SQLException {
		
		//creamos un objeto de tipo Fuente
		
		ArrayList<String> tablasFuente = new ArrayList<String>();
		
		Statement statement = this.pool.getConnection().createStatement();
        
		 ResultSet tablasResulset = statement.executeQuery(
        			"SHOW TABLES FROM "+this.SCHEMA+";");
        	
		while (tablasResulset.next()) {
        		tablasFuente.add(tablasResulset.getString(1));
        		
    }
		return new FuenteDatosRelacional(tablasFuente);
		
	}

	@Override
	public ArrayList<IAsignaturaFD2> getAsignaturasFD2() {
		return null;
	}

	@Override
	public ArrayList<IProfesorFD2> getProfesoresFD2() {
		return null;
	}

	@Override
	public IAsignaturaFD2 getAsignaturaFD2ById(String idAsig) {
		return null;
	}

	@Override
	public IProfesorFD2 getProfesorFD2ByDNI(String DNI) {
		return null;
	}
	
	
	

	@Override
	public ConcurrentHashMap<String, Asignatura> getAsignaturasEIHM() {
		
		Asignatura asig = null;
		
		Statement statement;
		
		ConcurrentHashMap<String, Asignatura> hma = new ConcurrentHashMap<String,Asignatura>();
		
		try {
			statement = this.pool.getConnection().createStatement();

			ResultSet asignaturas = statement.executeQuery("SELECT * FROM "
					+ this.SCHEMA + ".ASIGNATURA;");

			while (asignaturas.next()) {

				asig= new Asignatura(asignaturas.getString("idAsig"), asignaturas.getString("nombre"), asignaturas.getString("codPlan"), String.valueOf(asignaturas.getInt("numHoras")) ,"ND");
				
				hma.put(asignaturas.getString("idAsig"), asig);


			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return hma;
		

	}

	@Override
	public ConcurrentHashMap<String, Profesor> getProfesoresEIHM() {
		
		
		Profesor prof = null;
		
		Statement statement;
		
		ConcurrentHashMap<String, Profesor> hmp = new ConcurrentHashMap<String,Profesor>();
		
		try {
			statement = this.pool.getConnection().createStatement();

			ResultSet profesores = statement.executeQuery("SELECT * FROM "
					+ this.SCHEMA + ".PROFESORES;");

			while (profesores.next()) {

				prof= new Profesor(profesores.getString("dni"), profesores.getString("puesto"), profesores.getString("departamento"));
				
				hmp.put(profesores.getString("dni"), prof);


			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return hmp;
	}

	@Override
	public ConcurrentHashMap<String, AsignaturaNota> getAsignaturaNotaEIHM() {
		
		AsignaturaNota asigNot = null;
		
		Statement statement;
		
		ConcurrentHashMap<String, AsignaturaNota> hmp = new ConcurrentHashMap<String,AsignaturaNota>();
		
		try {
			statement = this.pool.getConnection().createStatement();

			ResultSet asigsNots = statement.executeQuery("SELECT * FROM "
					+ this.SCHEMA + ".ASIGNATURA;");

			while (asigsNots.next()) {

				asigNot= new AsignaturaNota(asigsNots.getString("idAsig"), "ND", "ND", "ND", "ND", "ND");
				
				hmp.put(asigsNots.getString("idAsig"), asigNot);


			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return hmp;
		
		
	}

	@Override
	public ArrayList<AsignaturaProfesor> getAsignaturaProfesor() {
		
		ArrayList<AsignaturaProfesor> asigProf = new ArrayList<AsignaturaProfesor>();

		AsignaturaProfesor asigProfAux = null;

		Statement statement;
		try {
			statement = this.pool.getConnection().createStatement();

			ResultSet asignaturas = statement
					.executeQuery("SELECT * FROM FD2.ASIGNATURAS_PROFESORES;");

			while (asignaturas.next()) {

				asigProfAux = new  AsignaturaProfesor(asignaturas.getString("dni"), asignaturas.getString("idAsig"));
						

				asigProf.add(asigProfAux);

			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

		return asigProf;
	}
	
	
	
	

}
